package design_pattern.study.spring;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 *  作为ApplicationContext接口的子类，所以该类也是非延时加载，所以需要在该类中定义一个Map集合，作为bean对象存储的容器。
 *  声明BeanDefinitionReader类型的变量，用来进行xml配置文件的解析，符合单一职责原则。
 *   BeanDefinitionReader类型的对象创建交由子类实现，因为只有子类明确到底创建BeanDefinitionReader哪儿个子实现类对象。
 * @Author fb_li
 * @Date 2022/6/7 20:50
 */
public abstract class AbstractApplicationContext implements ApplicationContext{

    //声明解析器变量 具体在子类中定义
    protected BeanDefinitionReader beanDefinitionReader;

    protected Map<String,Object> singletonObjects = new ConcurrentHashMap<String, Object>();

    //存储配置文件的路径
    protected String configLocation;

    @Override
    public void refresh() throws Exception {
        //加载BeanDefinition
        beanDefinitionReader.loadBeanDefinitions(configLocation);
        //初始化bean
        finishBeanInitialization();
    }

    private void finishBeanInitialization() throws Exception {
        BeanDefinitionRegistry registry = beanDefinitionReader.getRegistry();
        String[] beanDefinitionNames = registry.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames){
            //BeanDefinition beanDefinition = registry.getBeanDefinition(beanDefinitionName);
            getBean(beanDefinitionName);
        }

    }
}
